package br.com.foxinline.manager.editar;

import br.com.foxinline.enums.TipoAverbacao;
import br.com.foxinline.enums.Zona;
import br.com.foxinline.manager.criar.*;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.util.ArquivoUtilitario;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Msg;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerEditarAforamento implements Serializable {

    @EJB
    AforamentoServico aforamentoServico;
    @EJB
    AnexoServico anexoServico;
    private Aforamento aforamento;
    private ArquivoUtilitario arquivoUtilitario;
    private String aforamentoID;
    private List<Anexo> anexosRemover;
    private Anexo renomearAnexo;
    private Foreiro foreiro;
    private AverbacaoAforamento averbacao;
    private boolean editarAverbacao;

    @PostConstruct
    public void init() {
        arquivoUtilitario = new ArquivoUtilitario();
        anexosRemover = new ArrayList<Anexo>();
        renomearAnexo = new Anexo();
        foreiro = new Foreiro();
        averbacao = new AverbacaoAforamento();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        aforamentoID = params.get("aforamentoID");
        paramPost();
    }

    private void paramPost() {
        try {
            if (aforamentoID != null) {
                aforamento = aforamentoServico.find(Long.parseLong(aforamentoID));

                if (aforamento.getAnexos() == null) {
                    aforamento.setAnexos(new ArrayList<Anexo>());
                }

                if (aforamento.getForeiros() == null) {
                    aforamento.setForeiros(new ArrayList<Foreiro>());
                }

                if (aforamento.getAverbacoes() == null) {
                    aforamento.setAverbacoes(new ArrayList<AverbacaoAforamento>());
                }

                if (((aforamento.getForeiro() != null && !aforamento.getForeiro().isEmpty())
                        || (aforamento.getForeiroCpf() != null && !aforamento.getForeiroCpf().isEmpty()))
                        && aforamento.getForeiros().isEmpty()) {

                    Foreiro f = new Foreiro();
                    f.setNome(aforamento.getForeiro());
                    f.setCpf(Caracter.removecaracter(aforamento.getForeiroCpf()));

                    aforamento.getForeiros().add(f);

                    aforamento.setForeiro(null);
                    aforamento.setForeiroCpf(null);
                }
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public void atualizar() {
        try {

            if (aforamento.getAnexos().isEmpty()) {
                aforamento.setAnexos(null);
            }

            if (aforamento.getForeiros().isEmpty()) {
                aforamento.setForeiros(null);
            }

            if (!anexosRemover.isEmpty()) {
                anexoServico.delete(anexosRemover);
            }

            aforamentoServico.update(aforamento);
            aforamento = aforamentoServico.find(aforamento.getId());

            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<SelectItem> zona() {
        List<SelectItem> items = new ArrayList<SelectItem>();

        for (Zona item : Zona.values()) {
            items.add(new SelectItem(item, item.getNome()));
        }

        return items;
    }

    public void adicionarAnexo(FileUploadEvent event) throws IOException {
        try {
            Anexo anexo = arquivoUtilitario.adicionarArquivo(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType());
            aforamento.getAnexos().add(anexo);

        } catch (FileNotFoundException e) {
            System.err.println(e);
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        } catch (SQLException e) {
            System.err.println(e);
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /**
     * Remove o anexo da lista de anexos que está sendo adicionado e remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            anexosRemover.add(anexo);
            aforamento.getAnexos().remove(anexo);
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public void renomear() {
        try {
            anexoServico.update(renomearAnexo);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public void adicionarForeiro() {
        foreiro.setCpf(Caracter.removecaracter(foreiro.getCpf()));
        aforamento.getForeiros().add(foreiro);
        foreiro = new Foreiro();
    }

    public void removerForeiro(Foreiro foreiro) {
        aforamento.getForeiros().remove(foreiro);
    }

    public void editarForeiro(Foreiro foreiro) {
        this.foreiro = foreiro;
        removerForeiro(foreiro);
    }

    public String mascaraCpf(String cpf) {
        if (cpf != null && !cpf.isEmpty()) {
            return Caracter.addMask(cpf, Caracter.cpfMask);
        }

        return "";
    }

    public void adicionarAverbacao() {
        if (this.editarAverbacao) {
            aforamento.getAverbacoes().add(averbacao);
            averbacao = new AverbacaoAforamento();
            this.editarAverbacao = false;
        }
    }

    public void removerAverbacao(AverbacaoAforamento averbacao) {
        aforamento.getAverbacoes().remove(averbacao);
    }

    public void editarAverbacao(AverbacaoAforamento averbacao) {
        this.averbacao = averbacao;
        removerAverbacao(averbacao);
        this.editarAverbacao = true;
    }

    public void visualizarAverbacao(AverbacaoAforamento averbacao) {
        this.averbacao = averbacao;
    }

    public List<SelectItem> tipoAverbacao() {
        List<SelectItem> itens = new ArrayList<SelectItem>();
        for (TipoAverbacao item : TipoAverbacao.values()) {
            itens.add(new SelectItem(item, item.getNome()));
        }
        return itens;
    }

    public Aforamento getAforamento() {
        return aforamento;
    }

    public void setAforamento(Aforamento aforamento) {
        this.aforamento = aforamento;
    }

    public Anexo getRenomearAnexo() {
        return renomearAnexo;
    }

    public void setRenomearAnexo(Anexo renomearAnexo) {
        this.renomearAnexo = renomearAnexo;
    }

    public Foreiro getForeiro() {
        return foreiro;
    }

    public void setForeiro(Foreiro foreiro) {
        this.foreiro = foreiro;
    }

    public AverbacaoAforamento getAverbacao() {
        return averbacao;
    }

    public void setAverbacao(AverbacaoAforamento averbacao) {
        this.averbacao = averbacao;
    }
}
